package com.hmyd.hmyd_android.view.ad;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.ImageView;


/**
 * 图片下载
 * 
 * 
 *      General.UniversalImageLoader.Utils.IoUtils line:83
 *      General.UniversalImageLoader.Core.ImageLoaderConfiguration line:173
 * 
 **/
public class AsyncImageLoader implements ImageLoadingListener,
		com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener {

	// 设置图片在下载期间显示的图片
	// showStubImage(R.drawable.ic_launcher)
	// 设置图片Uri为空或是错误的时候显示的图片
	// showImageForEmptyUri(R.drawable.ic_empty)
	// 设置图片加载/解码过程中错误时候显示的图片
	// showImageOnFail(R.drawable.ic_error)
	// 设置图片在下载前是否重置，复位
	// resetViewBeforeLoading()
	// 设置下载的图片是否缓存在内存中
	// cacheInMemory()
	// 设置下载的图片是否缓存在SD卡中
	// cacheOnDisc()
	// 设置图片的解码类型
	// bitmapConfig(Bitmap.Config.RGB_565)
	// 设置图片的解码配置
	// decodingOptions(android.graphics.BitmapFactory.Options decodingOptions)
	// 设置图片下载前的延迟
	// delayBeforeLoading(int delayInMillis)
	// 设置额外的内容给ImageDownloader
	// extraForDownloader(Object extra)
	// 设置图片加入缓存前，对bitmap进行设置
	// preProcessor(BitmapProcessor preProcessor)
	// 设置显示前的图片，显示后这个图片一直保留在缓存中
	// postProcessor(BitmapProcessor postProcessor)
	// 设置图片以如何的编码方式显示
	// imageScaleType(ImageScaleType imageScaleType)

	// displayer(BitmapDisplayer displayer)
	// displayer：
	// RoundedBitmapDisplayer（int roundPixels）设置圆角图片
	// FakeBitmapDisplayer（）这个类什么都没做
	// FadeInBitmapDisplayer（int durationMillis）设置图片渐显的时间
	// SimpleBitmapDisplayer()正常显示一张图片　　

	// imageScaleType(ImageScaleType imageScaleType)
	// imageScaleType:
	// EXACTLY :图像将完全按比例缩小的目标大小
	// EXACTLY_STRETCHED:图片会缩放到目标大小完全
	// IN_SAMPLE_INT:图像将被二次采样的整数倍
	// IN_SAMPLE_POWER_OF_2:图片将降低2倍，直到下一减少步骤，使图像更小的目标大小
	// NONE:图片不会调整

	private DisplayImageOptions options;
	private ImageLoader mImageLoader;
	private ImageLoadingListener mListener;
	private com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener mProgressListener;

	public AsyncImageLoader(Context mContext) {

		this(mContext, -1);

	}

	public AsyncImageLoader(Context mContext, int mIconId) {

		options = new DisplayImageOptions.Builder()//
				.showImageOnLoading(mIconId)// 设置图片在下载期间显示的图片
				.showImageForEmptyUri(mIconId)// 设置图片Uri为空或是错误的时候显示的图片
				.showImageOnFail(mIconId)// 设置图片加载/解码过程中错误时候显示的图片
				.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
				.cacheOnDisk(true)// 设置下载的图片是否缓存在SD卡中
				.considerExifParams(true)//
				// .displayer(new FadeInBitmapDisplayer(300))//设置图片渐现时间
				// .decodingOptions(getDefaultOptions())// 设置图片的解码配置
				.imageScaleType(ImageScaleType.EXACTLY)// 设置图片以如何的编码方式显示
				.build();//
		mImageLoader = ImageLoader.getInstance();
//		mImageLoader.init(ImageLoaderConfiguration.createDefault(mContext));

	}


	public AsyncImageLoader(Context mContext, int mIconId, int mRoundPixels) {

		options = new DisplayImageOptions.Builder()//
				.showImageOnLoading(mIconId)// 设置图片在下载期间显示的图片
				.showImageForEmptyUri(mIconId)// 设置图片Uri为空或是错误的时候显示的图片
				.showImageOnFail(mIconId)// 设置图片加载/解码过程中错误时候显示的图片
				.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
				.cacheOnDisk(true)// 设置下载的图片是否缓存在SD卡中
				.considerExifParams(true)//
				.displayer(new RoundedBitmapDisplayer(mRoundPixels))//设置圆角
				// .decodingOptions(getDefaultOptions())// 设置图片的解码配置
				.imageScaleType(ImageScaleType.EXACTLY)// 设置图片以如何的编码方式显示
				.build();//
		mImageLoader = ImageLoader.getInstance();
//		mImageLoader.init(ImageLoaderConfiguration.createDefault(mContext));

	}

	private BitmapFactory.Options getDefaultOptions() {

		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inPurgeable = true;
		options.inInputShareable = true;
		options.inPreferredConfig = Bitmap.Config.ARGB_8888;
		return options;

	}

	/**
	 * 设置图片下载监听接口
	 * */
	public void setImageLoadingListener(ImageLoadingListener mListener) {
		this.mListener = mListener;
	}

	/**
	 * 设置图片下载进度监听接口
	 * */
	public void ImageLoadingProgressListener(
			com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener mProgressListener) {
		this.mProgressListener = mProgressListener;
	}

	/**
	 * 异步下载图片
	 * */
	public void load(String imageUrl) {
		mImageLoader.loadImage(imageUrl, this);
	}

	/**
	 * 异步下载图片
	 * */
	public void load(String imageUrl, ImageLoadingListener listener) {
		this.mListener = listener;
		// mImageLoader.loadImage(imageUrl, this);
		mImageLoader.loadImage(imageUrl, null, options, this, null);
	}

	/**
	 * 异步加载图片
	 * */
	public void load(String imageUrl, ImageView mView) {
		mImageLoader.displayImage(imageUrl, mView, options, this, this);
	}

	/**
	 * 异步加载图片
	 * */
	public void load(String imageUrl, ImageView mView,
			ImageLoadingListener listener) {
		this.mListener = listener;
		mImageLoader.displayImage(imageUrl, mView, options, this, this);
	}

	/**
	 * 异步加载图片
	 * */
	public void load(String imageUrl, ImageView mView,
			ImageLoadingListener listener,
			com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener mProgressListener) {
		this.mListener = listener;
		this.mProgressListener = mProgressListener;
		mImageLoader.displayImage(imageUrl, mView, options, this, this);
	}

	/**
	 * 清空缓存
	 * */
	public void clear() {
		mImageLoader.clearDiskCache();
		mImageLoader.clearMemoryCache();
	}

	@Override
	public void onProgressUpdate(String imageUri, View view, int current,
			int total) {
		// TODO Auto-generated method stub
		if (mProgressListener != null)
			mProgressListener.onProgressUpdate(imageUri, view, current, total);

	}

	@Override
	public void onLoadingStarted(String imageUri, View view) {
		// TODO Auto-generated method stub
		if (mListener != null)
			mListener.onLoadingStarted(imageUri, view);
	}

	@Override
	public void onLoadingFailed(String imageUri, View view,
			FailReason failReason) {
		// TODO Auto-generated method stub
		if (mListener != null)
			mListener.onLoadingFailed(imageUri, view, failReason);
	}

	@Override
	public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
		// TODO Auto-generated method stub
		if (mListener != null)
			mListener.onLoadingComplete(imageUri, view, loadedImage);
	}

	@Override
	public void onLoadingCancelled(String imageUri, View view) {
		// TODO Auto-generated method stub
		if (mListener != null)
			mListener.onLoadingCancelled(imageUri, view);
	}

	public ImageLoader getImageLoader() {
		return mImageLoader;
	}

}
